#pragma once

/*
 * 日志条目抽象基类
 * raft_core（raft 核心层）与 state_machine（状态机层）通讯传递信息
 */

#include <string>

namespace raft::core {
    class ApplyMsg {
    public:
        ApplyMsg() : command_valid_(false),
                     command_(),
                     commit_index_(-1),
                     snapshot_valid_(false),
                     snapshot_(),
                     snapshot_term_(-1),
                     snapshot_index_(-1) {}

        [[nodiscard]] bool is_command_valid() const;

        void set_command_valid(bool command_valid);

        [[nodiscard]] const std::string &get_command() const;

        void set_command(const std::string &command);

        [[nodiscard]] int get_commint_index() const;

        void set_commint_index(int commint_index);

        [[nodiscard]] bool is_snapshot_valid() const;

        void set_snapshot_valid(bool snapshot_valid);

        [[nodiscard]] const std::string &get_snapshot() const;

        void set_snapshot(const std::string &snapshot);

        [[nodiscard]] int get_snapshot_term() const;

        void set_snapshot_term(int snapshot_term);

        [[nodiscard]] int get_snapshot_index() const;

        void set_snapshot_index(int snapshot_index);

    private:
        bool command_valid_;
        // 应用的命令内容
        std::string command_;
        // 命令在日志中的所有
        int commit_index_;
        // 快照有效标识
        bool snapshot_valid_;
        // 快照数据
        std::string snapshot_;
        // 创建快照的任期号
        int snapshot_term_;
        // 快照要覆盖到的日志的最大索引
        int snapshot_index_;
    };
}// namespace raft::core